package com.kfm.base.oop3;

public class Cat extends Animal {
    /*
      子类中有和父类同名的变量，就会发生隐藏(hiding)
      子类变量可以隐藏父类变量, 和 static 无关(4种情况)
      instance-field  hiding  instance-field
                      hiding  static-field
      static-field  hiding  instance-field
                    hiding  static-field

      子类有和父类同名的变量，此时子类中所有此变量名的变量都是子类的
      要使用父类的变量需要通过 super
    */
    static boolean a = true;

    boolean b = true;

    /*
      创建子类对象时需要先创建父类对象，默认在构造方法第一行调用父类的无参构造创建. 调用代码可以省略
      如果父类没有无参构造，则需要在每一个构造方法的第一行通过 super 关键字显式去调用父类的构造方法。

        super 表示父类对象, super([参数列表]) 表示调用父类的构造方法。【必须在第一行】
        在子类中要想使用父类可见的成员可以通过 super.成员 来调用
        和 this 的使用类似，但所表示的对象不同
     */
    public Cat(String name) {
        super(name, "猫科");
    }

    public Cat() {
        this("");
    }

    @Override
    public void say() {
        System.out.println(super.getName() + "喵喵 叫");
    }

    public void sleep() {
        System.out.println("睡觉");
    }

    public void print(){
        System.out.println("cat: " + a);
        System.out.println("cat: " + b);
        System.out.println("animal: " + super.a);
        System.out.println("animal: " + super.b);
    }


    /*
      隐藏：
        子类中有和父类同名的 static 方法，子类的方法会隐藏父类的方法
        只能是子类的 static方法隐藏父类的 static 方法

     */
    public static void staticMethod(){
        System.out.println("Cat :: staticMethod");
    }


    /**
     * 当前对象的字符串形式表示
     * 没有固定写法，但是一般都是返回 类 + 字段 + 值
     * @return
     */
    @Override
    public String toString(){
        return "cat 的实例: 名字是 " + super.getName();
    }
}
